#include <vector>
#include <string>
#include <fstream>
#include <filesystem>
#include <unordered_map>
#include <algorithm>
#include <iostream>
#include "simdjson.h"

// 特殊键映射表
const std::unordered_map<std::string, std::string> SPECIAL_KEYS = {
    {"\u001bOD", "[LEFT]"},    // 左箭头
    {"\u001bOC", "[RIGHT]"},   // 右箭头
    {"\u001bOA", "[UP]"},      // 上箭头
    {"\u001bOB", "[DOWN]"},    // 下箭头
    {"\r", "[ENTER]"},         // 回车
    {"\t", "[TAB]"},           // 制表符
    {"\u007f", "[BACKSPACE]"}, // 退格键
    {"\u001b", "[ESC]"}};      // esc键

void process_cast_file(std::vector<std::string> &records, const std::filesystem::path &cast_file)
{
    std::ifstream file(cast_file);
    if (!file.is_open())
    {
        std::cerr << "Error: Could not open file '" << cast_file << "'" << std::endl;
        return;
    }

    // 创建 simdjson 解析器
    simdjson::dom::parser parser;
    std::string line;
    std::string current_text;

    // 跳过第一行（通常是header）
    std::getline(file, line);

    while (std::getline(file, line))
    {
        // 跳过空行
        if (line.empty())
            continue;

        // 确保字符串以null结尾且正确初始化
        line.shrink_to_fit();

        try
        {
            // 解析单行JSON
            simdjson::dom::element event;
            auto error = parser.parse(line).get(event);
            if (error)
            {
                std::cerr << "Error parsing line: " << line << "\nError: " << simdjson::error_message(error) << std::endl;
                continue;
            }

            // 检查是否为数组 [time, type, data]
            simdjson::dom::array event_array;
            if (!event.is_array() || event.get(event_array))
            {
                continue;
            }

            // 检查数组长度是否为3
            if (event_array.size() != 3)
            {
                continue;
            }

            // 检查事件类型是否为输入 ('i')
            std::string_view event_type;
            if (event_array.at(1).get(event_type))
            {
                continue;
            }

            if (event_type != "i")
            {
                continue; // 只处理输入事件
            }

            // 获取事件数据
            std::string_view event_data;
            if (event_array.at(2).get(event_data))
            {
                continue;
            }

            auto str = std::string(event_data);
            // 检查是否是特殊键
            auto it = SPECIAL_KEYS.find(str);
            if (it != SPECIAL_KEYS.end())
            {
                // 如果有累积的普通字符，先添加
                if (!current_text.empty())
                {
                    records.push_back(current_text);
                    current_text.clear();
                }
                // 添加特殊键标记
                records.push_back(it->second);
            }
            else
            {
                // 不是特殊键，累积到当前文本
                current_text += str;
            }
        }
        catch (const std::exception &e)
        {
            std::cerr << "Exception while processing line: " << e.what() << std::endl;
            continue;
        }
    }

    // 添加最后累积的文本
    if (!current_text.empty())
    {
        records.push_back(current_text);
    }
}

int main(int argc, char *argv[])
{
    if (argc < 2)
    {
        std::cerr << "Usage: " << argv[0] << " <cast_file>" << std::endl;
        return 1;
    }

    std::vector<std::string> test;
    std::filesystem::path file = argv[1];

    // 检查文件是否存在
    if (!std::filesystem::exists(file))
    {
        std::cerr << "Error: File '" << file << "' does not exist." << std::endl;
        return 1;
    }

    process_cast_file(test, file);

    // 输出结果
    for (const auto &str : test)
    {
        std::cout << str << std::endl;
    }

    return 0;
}